import { AxiosInstance, AxiosStatic ,AxiosRequestConfig } from './types/index';
import defaults from './default';
import Axios from './core/Axios'
import { extend } from './helpers/util'
import mergeConfig from './core/meregeConfig';

// axios cancel扩展
import CancelToken from './cancel/CancelToken';
import Cancel, { isCancel } from './cancel/Cancel';

function createInstance(initConfig: AxiosRequestConfig): AxiosStatic {
  const context = new Axios(initConfig);
  const instance = Axios.prototype.request.bind(context)
  extend(instance, context)
  return  instance as AxiosStatic
}

const axios = createInstance(defaults);

axios.create = function(config) {
  return createInstance(mergeConfig(defaults, config))
}

axios.CancelToken = CancelToken
axios.Cancel = Cancel
axios.isCancel = isCancel

axios.all = function all(promises) {
  return Promise.all(promises)
}

axios.spread = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr)
  }
}

axios.Axios = Axios

export default axios